<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>simplewrite.c</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="kvaser.gif"/></td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('simplewrite_8c-example.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">simplewrite.c</div>  </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><span class="comment">/*</span></div><div class="line"><span class="comment">**             Copyright 2017 by Kvaser AB, Molndal, Sweden</span></div><div class="line"><span class="comment">**                         http://www.kvaser.com</span></div><div class="line"><span class="comment">**</span></div><div class="line"><span class="comment">** This software is dual licensed under the following two licenses:</span></div><div class="line"><span class="comment">** BSD-new and GPLv2. You may use either one. See the included</span></div><div class="line"><span class="comment">** COPYING file for details.</span></div><div class="line"><span class="comment">**</span></div><div class="line"><span class="comment">** License: BSD-new</span></div><div class="line"><span class="comment">** ==============================================================================</span></div><div class="line"><span class="comment">** Redistribution and use in source and binary forms, with or without</span></div><div class="line"><span class="comment">** modification, are permitted provided that the following conditions are met:</span></div><div class="line"><span class="comment">**     * Redistributions of source code must retain the above copyright</span></div><div class="line"><span class="comment">**       notice, this list of conditions and the following disclaimer.</span></div><div class="line"><span class="comment">**     * Redistributions in binary form must reproduce the above copyright</span></div><div class="line"><span class="comment">**       notice, this list of conditions and the following disclaimer in the</span></div><div class="line"><span class="comment">**       documentation and/or other materials provided with the distribution.</span></div><div class="line"><span class="comment">**     * Neither the name of the &lt;organization&gt; nor the</span></div><div class="line"><span class="comment">**       names of its contributors may be used to endorse or promote products</span></div><div class="line"><span class="comment">**       derived from this software without specific prior written permission.</span></div><div class="line"><span class="comment">**</span></div><div class="line"><span class="comment">** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span></div><div class="line"><span class="comment">** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span></div><div class="line"><span class="comment">** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span></div><div class="line"><span class="comment">** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE</span></div><div class="line"><span class="comment">** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span></div><div class="line"><span class="comment">** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span></div><div class="line"><span class="comment">** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR</span></div><div class="line"><span class="comment">** BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER</span></div><div class="line"><span class="comment">** IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span></div><div class="line"><span class="comment">** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span></div><div class="line"><span class="comment">** POSSIBILITY OF SUCH DAMAGE.</span></div><div class="line"><span class="comment">**</span></div><div class="line"><span class="comment">**</span></div><div class="line"><span class="comment">** License: GPLv2</span></div><div class="line"><span class="comment">** ==============================================================================</span></div><div class="line"><span class="comment">** This program is free software; you can redistribute it and/or modify</span></div><div class="line"><span class="comment">** it under the terms of the GNU General Public License as published by</span></div><div class="line"><span class="comment">** the Free Software Foundation; either version 2 of the License, or</span></div><div class="line"><span class="comment">** (at your option) any later version.</span></div><div class="line"><span class="comment">**</span></div><div class="line"><span class="comment">** This program is distributed in the hope that it will be useful,</span></div><div class="line"><span class="comment">** but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><span class="comment">** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span></div><div class="line"><span class="comment">** GNU General Public License for more details.</span></div><div class="line"><span class="comment">**</span></div><div class="line"><span class="comment">** You should have received a copy of the GNU General Public License</span></div><div class="line"><span class="comment">** along with this program; if not, write to the Free Software</span></div><div class="line"><span class="comment">** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA</span></div><div class="line"><span class="comment">**</span></div><div class="line"><span class="comment">**</span></div><div class="line"><span class="comment">** IMPORTANT NOTICE:</span></div><div class="line"><span class="comment">** ==============================================================================</span></div><div class="line"><span class="comment">** This source code is made available for free, as an open license, by Kvaser AB,</span></div><div class="line"><span class="comment">** for use with its applications. Kvaser AB does not accept any liability</span></div><div class="line"><span class="comment">** whatsoever for any third party patent or other immaterial property rights</span></div><div class="line"><span class="comment">** violations that may result from any usage of this source code, regardless of</span></div><div class="line"><span class="comment">** the combination of source code and various applications that it can be used</span></div><div class="line"><span class="comment">** in, or with.</span></div><div class="line"><span class="comment">**</span></div><div class="line"><span class="comment">** -----------------------------------------------------------------------------</span></div><div class="line"><span class="comment">*/</span></div><div class="line"></div><div class="line"><span class="comment">/*</span></div><div class="line"><span class="comment"> * Kvaser Linux Canlib</span></div><div class="line"><span class="comment"> * Send a CAN message</span></div><div class="line"><span class="comment"> */</span></div><div class="line"></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="canlib_8h.html">canlib.h</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="canstat_8h.html">canstat.h</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;stdio.h&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;signal.h&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;errno.h&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;unistd.h&gt;</span></div><div class="line"></div><div class="line"><span class="keyword">static</span> <span class="keywordtype">void</span> check(<span class="keywordtype">char</span>* <span class="keywordtype">id</span>, <a class="code" href="canstat_8h.html#a52b5e5c71832b0bd3c6a5b1fd48583e7">canStatus</a> stat)</div><div class="line">{</div><div class="line">  <span class="keywordflow">if</span> (stat != <a name="a0"></a><a class="code" href="canstat_8h.html#a52b5e5c71832b0bd3c6a5b1fd48583e7a49743d0d438957118b9c6af2e831b209">canOK</a>) {</div><div class="line">    <span class="keywordtype">char</span> buf[50];</div><div class="line">    buf[0] = <span class="charliteral">&#39;\0&#39;</span>;</div><div class="line">    <a name="a1"></a><a class="code" href="group__can__general.html#ga01a7a415c95c579750bcdd95a1d245c4">canGetErrorText</a>(stat, buf, <span class="keyword">sizeof</span>(buf));</div><div class="line">    printf(<span class="stringliteral">&quot;%s: failed, stat=%d (%s)\n&quot;</span>, <span class="keywordtype">id</span>, (<span class="keywordtype">int</span>)stat, buf);</div><div class="line">  }</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keyword">static</span> <span class="keywordtype">void</span> printUsageAndExit(<span class="keywordtype">char</span> *prgName)</div><div class="line">{</div><div class="line">  printf(<span class="stringliteral">&quot;Usage: &#39;%s &lt;channel&gt;&#39;\n&quot;</span>, prgName);</div><div class="line">  exit(1);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keyword">static</span> <span class="keywordtype">void</span> sighand(<span class="keywordtype">int</span> sig, siginfo_t *info, <span class="keywordtype">void</span> *ucontext)</div><div class="line">{</div><div class="line">  (void) sig;</div><div class="line">  (void) info;</div><div class="line">  (void) ucontext;</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* busStatToStr(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> flag)</div><div class="line">{</div><div class="line">  <span class="keywordflow">switch</span> (flag) {</div><div class="line">    <span class="keywordflow">case</span> <a name="a2"></a><a class="code" href="canstat_8h.html#a06a51383b823f78d63bbb6e08aa0948b">canSTAT_ERROR_PASSIVE</a>:</div><div class="line">      <span class="keywordflow">return</span> <span class="stringliteral">&quot;canSTAT_ERROR_PASSIVE&quot;</span>;</div><div class="line"></div><div class="line">    <span class="keywordflow">case</span> <a name="a3"></a><a class="code" href="canstat_8h.html#aab3d45d8b4e8bfbba45d585fb6195fbf">canSTAT_BUS_OFF</a>:</div><div class="line">      <span class="keywordflow">return</span> <span class="stringliteral">&quot;canSTAT_BUS_OFF&quot;</span>;</div><div class="line"></div><div class="line">    <span class="keywordflow">case</span> <a name="a4"></a><a class="code" href="canstat_8h.html#ae6f14de69c7a46b9ab2c5e8e9e6518f2">canSTAT_ERROR_WARNING</a>:</div><div class="line">      <span class="keywordflow">return</span> <span class="stringliteral">&quot;canSTAT_ERROR_WARNING&quot;</span>;</div><div class="line"></div><div class="line">    <span class="keywordflow">case</span> <a name="a5"></a><a class="code" href="canstat_8h.html#ab25a3795fe1e47e5011fd02c0fad0fbd">canSTAT_ERROR_ACTIVE</a>:</div><div class="line">      <span class="keywordflow">return</span> <span class="stringliteral">&quot;canSTAT_ERROR_ACTIVE&quot;</span>;</div><div class="line"></div><div class="line">    <span class="keywordflow">default</span>:</div><div class="line">      <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div><div class="line">  }</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keywordtype">void</span> notifyCallback(<a name="_a6"></a><a class="code" href="structcan_notify_data.html">canNotifyData</a> *data)</div><div class="line">{</div><div class="line">  <span class="keywordflow">switch</span> (data-&gt;<a name="a7"></a><a class="code" href="structcan_notify_data.html#aa73ed1819d01004c05b8b1908ef91ef4">eventType</a>) {</div><div class="line">    <span class="keywordflow">case</span> <a name="a8"></a><a class="code" href="canstat_8h.html#a0c59f7bbcb5cceaefe0d1d5915e8b4fc">canEVENT_STATUS</a>:</div><div class="line">      printf(<span class="stringliteral">&quot;CAN Status Event: %s\n&quot;</span>, busStatToStr(data-&gt;<a name="a9"></a><a class="code" href="structcan_notify_data.html#ae129dc8383274d477e1709e2df4a4d74">info</a>.<a name="a10"></a><a class="code" href="structcan_notify_data.html#a345c20017f48fbb3fb2b3adada292f29">status</a>.busStatus));</div><div class="line">      <span class="keywordflow">break</span>;</div><div class="line"></div><div class="line">    <span class="keywordflow">case</span> <a name="a11"></a><a class="code" href="canstat_8h.html#a5a6431078d49d8f7cc36c6313db44406">canEVENT_ERROR</a>:</div><div class="line">      printf(<span class="stringliteral">&quot;CAN Error Event\n&quot;</span>);</div><div class="line">      <span class="keywordflow">break</span>;</div><div class="line"></div><div class="line">    <span class="keywordflow">case</span> <a name="a12"></a><a class="code" href="canstat_8h.html#a21669303d34190235f63303deae6b248">canEVENT_TX</a>:</div><div class="line">      printf(<span class="stringliteral">&quot;CAN Tx Event\n&quot;</span>);</div><div class="line">      <span class="keywordflow">break</span>;</div><div class="line"></div><div class="line">    <span class="keywordflow">case</span> <a name="a13"></a><a class="code" href="canstat_8h.html#af5f5917ba5476570815747b960e26ba6">canEVENT_RX</a>:</div><div class="line">      printf(<span class="stringliteral">&quot;CAN Rx Event\n&quot;</span>);</div><div class="line">      <span class="keywordflow">break</span>;</div><div class="line">  }</div><div class="line">  <span class="keywordflow">return</span>;</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div><div class="line">{</div><div class="line">  <a class="code" href="canlib_8h.html#ae3d1b041d62207d5336f93c089cd5b65">canHandle</a> hnd;</div><div class="line">  <a class="code" href="canstat_8h.html#a52b5e5c71832b0bd3c6a5b1fd48583e7">canStatus</a> stat;</div><div class="line">  <span class="keywordtype">int</span> channel;</div><div class="line">  <span class="keyword">struct </span>sigaction sigact;</div><div class="line"></div><div class="line">  <span class="keywordflow">if</span> (argc != 2) {</div><div class="line">    printUsageAndExit(argv[0]);</div><div class="line">  }</div><div class="line"></div><div class="line">  {</div><div class="line">    <span class="keywordtype">char</span> *endPtr = NULL;</div><div class="line">    errno = 0;</div><div class="line">    channel = strtol(argv[1], &amp;endPtr, 10);</div><div class="line">    <span class="keywordflow">if</span> ( (errno != 0) || ((channel == 0) &amp;&amp; (endPtr == argv[1])) ) {</div><div class="line">      printUsageAndExit(argv[0]);</div><div class="line">    }</div><div class="line">  }</div><div class="line"></div><div class="line">  <span class="comment">/* Use sighand and allow SIGINT to interrupt syscalls */</span></div><div class="line">  sigact.sa_flags = SA_SIGINFO;</div><div class="line">  sigemptyset(&amp;sigact.sa_mask);</div><div class="line">  sigact.sa_sigaction = sighand;</div><div class="line">  <span class="keywordflow">if</span> (sigaction(SIGINT, &amp;sigact, NULL) != 0) {</div><div class="line">    perror(<span class="stringliteral">&quot;sigaction SIGINT failed&quot;</span>);</div><div class="line">    <span class="keywordflow">return</span> -1;</div><div class="line">  }</div><div class="line"></div><div class="line">  printf(<span class="stringliteral">&quot;Sending a CAN message on channel %d\n&quot;</span>, channel);</div><div class="line"></div><div class="line">  <a name="a14"></a><a class="code" href="group__can__general.html#gaff1ec1d3416d3bdd56336a7b9ac008b1">canInitializeLibrary</a>();</div><div class="line"></div><div class="line">  <span class="comment">/* Open channel, set parameters and go on bus */</span></div><div class="line">  hnd = <a name="a15"></a><a class="code" href="group___c_a_n.html#gac377d182232fb4ec2fed881c2b9ab300">canOpenChannel</a>(channel, <a name="a16"></a><a class="code" href="canlib_8h.html#afacd9e186d273d0dc24956ea0d433822">canOPEN_EXCLUSIVE</a> | <a name="a17"></a><a class="code" href="canlib_8h.html#a161c14f3b9d1e5cff276c6246a651fcd">canOPEN_REQUIRE_EXTENDED</a> | <a name="a18"></a><a class="code" href="canlib_8h.html#a8e4ead14e67e49e27674c706e0d88f23">canOPEN_ACCEPT_VIRTUAL</a>);</div><div class="line">  <span class="keywordflow">if</span> (hnd &lt; 0) {</div><div class="line">    printf(<span class="stringliteral">&quot;canOpenChannel %d&quot;</span>, channel);</div><div class="line">    check(<span class="stringliteral">&quot;&quot;</span>, hnd);</div><div class="line">    <span class="keywordflow">return</span> -1;</div><div class="line">  }</div><div class="line"></div><div class="line">  stat = <a name="a19"></a><a class="code" href="group___c_a_n.html#ga7eb8c2e92cfae57e7ec5031818524301">canSetBusParams</a>(hnd, <a name="a20"></a><a class="code" href="canlib_8h.html#ac823cae7d94763607a7ca40fcdb5196d">canBITRATE_1M</a>, 0, 0, 0, 0, 0);</div><div class="line">  check(<span class="stringliteral">&quot;canSetBusParams&quot;</span>, stat);</div><div class="line">  <span class="keywordflow">if</span> (stat != <a class="code" href="canstat_8h.html#a52b5e5c71832b0bd3c6a5b1fd48583e7a49743d0d438957118b9c6af2e831b209">canOK</a>) {</div><div class="line">    <span class="keywordflow">goto</span> ErrorExit;</div><div class="line">  }</div><div class="line"></div><div class="line">  stat = <a name="a21"></a><a class="code" href="group___c_a_n.html#gaa5dd0f277c7059169055321fbda87486">canSetNotify</a>(hnd, notifyCallback, <a name="a22"></a><a class="code" href="canstat_8h.html#af0b2b8979177da5f9c875f584f9c7d9c">canNOTIFY_RX</a> | <a name="a23"></a><a class="code" href="canstat_8h.html#a14e966f0b3f498285fb332632df60a88">canNOTIFY_TX</a> | <a name="a24"></a><a class="code" href="canstat_8h.html#a91afcc669b1b8be0ed390aac37e44805">canNOTIFY_ERROR</a> | <a name="a25"></a><a class="code" href="canstat_8h.html#ae04b14c6acacd116cceaf78abc8b02c0">canNOTIFY_STATUS</a> | <a name="a26"></a><a class="code" href="canstat_8h.html#ab69dc959890826b245c422966c4bf627">canNOTIFY_ENVVAR</a>, (<span class="keywordtype">char</span>*)0);</div><div class="line">  check(<span class="stringliteral">&quot;canSetNotify&quot;</span>, stat);</div><div class="line"></div><div class="line">  stat = <a name="a27"></a><a class="code" href="group___c_a_n.html#ga99c7c99cc71580f8099a1407f4f9ea1a">canBusOn</a>(hnd);</div><div class="line">  check(<span class="stringliteral">&quot;canBusOn&quot;</span>, stat);</div><div class="line">  <span class="keywordflow">if</span> (stat != <a class="code" href="canstat_8h.html#a52b5e5c71832b0bd3c6a5b1fd48583e7a49743d0d438957118b9c6af2e831b209">canOK</a>) {</div><div class="line">    <span class="keywordflow">goto</span> ErrorExit;</div><div class="line">  }</div><div class="line"></div><div class="line">  stat = <a name="a28"></a><a class="code" href="group___c_a_n.html#ga62c185329d6741c90102511e2f37983e">canWrite</a>(hnd, 10000, <span class="stringliteral">&quot;Kvaser!&quot;</span>, 8, 0);</div><div class="line">  check(<span class="stringliteral">&quot;canWrite&quot;</span>, stat);</div><div class="line">  <span class="keywordflow">if</span> (stat != <a class="code" href="canstat_8h.html#a52b5e5c71832b0bd3c6a5b1fd48583e7a49743d0d438957118b9c6af2e831b209">canOK</a>) {</div><div class="line">    <span class="keywordflow">goto</span> ErrorExit;</div><div class="line">  }</div><div class="line">  stat = <a name="a29"></a><a class="code" href="group___c_a_n.html#ga304cb3a7bc2874c1f8ad361a911bcd5f">canWriteSync</a>(hnd, 1000);</div><div class="line">  check(<span class="stringliteral">&quot;canWriteSync&quot;</span>, stat);</div><div class="line">  <span class="keywordflow">if</span> (stat != <a class="code" href="canstat_8h.html#a52b5e5c71832b0bd3c6a5b1fd48583e7a49743d0d438957118b9c6af2e831b209">canOK</a>) {</div><div class="line">    <span class="keywordflow">goto</span> ErrorExit;</div><div class="line">  }</div><div class="line"></div><div class="line">ErrorExit:</div><div class="line"></div><div class="line">  stat = <a name="a30"></a><a class="code" href="group___c_a_n.html#gaf1786cfbfd542b18b9c599d278837bd9">canBusOff</a>(hnd);</div><div class="line">  check(<span class="stringliteral">&quot;canBusOff&quot;</span>, stat);</div><div class="line">  usleep(50*1000); <span class="comment">// Sleep just to get the last notification.</span></div><div class="line">  stat = <a name="a31"></a><a class="code" href="group___c_a_n.html#ga49525373a4d08d93c651ec10f79dd36b">canClose</a>(hnd);</div><div class="line">  check(<span class="stringliteral">&quot;canClose&quot;</span>, stat);</div><div class="line">  stat = <a name="a32"></a><a class="code" href="group__can__general.html#ga0d1c0e54ea20c3e3b328a32eb10c7b47">canUnloadLibrary</a>();</div><div class="line">  check(<span class="stringliteral">&quot;canUnloadLibrary&quot;</span>, stat);</div><div class="line"></div><div class="line">  <span class="keywordflow">return</span> 0;</div><div class="line">}</div></div><!-- fragment --> </div><!-- contents -->
</div><!-- doc-content -->
<!-- HTML footer for doxygen 1.8.13-->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer"> (canlib 5.38) Tue Feb 15 2022</li>
  </ul>
</div>
</body>
</html>
